home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / WANDR330.ZIP / SRC / SCORES.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-01  |  6.7 KB  |  267 lines

  1. #include "wand_head.h"
  2. #include <curses.h>
  3.  
  4. #ifdef    MSDOS    /* M001    */
  5. #define    LOCK
  6. #define    UNLOCK
  7. #else
  8. /*#define LOCK     flock( fp->_cnt , LOCK_EX ) /* peeked at stdio.h ! */
  9. /*#define UNLOCK   flock( fp->_cnt , LOCK_UN ) /*                     */
  10. #define LOCK while ((lock = creat(LOCKFILE,0))==-1)
  11. #define UNLOCK unlink(LOCKFILE)
  12. #endif
  13.  
  14. #ifndef    MSDOS    /* M001 */
  15. extern int getuid();
  16. #else
  17. #define     getuid()    0
  18. #endif
  19.  
  20. extern int saved_game;  /* prevent recording of hiscore if  */
  21.             /* NO_RESTORED_GAME_HISCORES is #def'd */
  22.  
  23. typedef struct {
  24.     char howdead[25];
  25.     char name[20];
  26.     long score;
  27.     int  level;
  28.     int  uid;
  29. } score_entry;
  30.  
  31. extern WINDOW *messagewin;
  32. char string[20];
  33.  
  34. #ifdef    LINT_ARGS    /* M001    */
  35. void show_scores(score_entry *, int);
  36. int readtable(score_entry *);
  37. #else
  38. void show_scores();
  39. int readtable();
  40. #endif
  41.  
  42. void show_scores(table, num)
  43. score_entry *table;
  44. int num;
  45. {
  46.     int tot = num;
  47.  
  48.     printf("\nNo. Score Level           Names                 How they died\n");
  49.     printf("=============================================================================\n");
  50.     while (num > 0) {
  51.     num--;
  52.     printf("%2d %5ld %3d      %-20s     killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead);
  53.     table++;
  54.     }
  55.     printf("\n\n");
  56. }
  57.  
  58. int readtable(table_ptr)
  59. score_entry *table_ptr;
  60. {
  61.     FILE *fp;
  62.     int  numread;
  63.  
  64.     if ((fp = fopen(HISCOREPATH,R_BIN)) == NULL)
  65.     numread = 0;
  66.     else {
  67.     numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp);
  68.     fclose(fp);
  69.     }
  70.     return numread;
  71. }
  72.  
  73. int savescore(howdead, score, level, name)
  74. char *howdead, *name;
  75. int  level;
  76. long score;
  77. {
  78.     score_entry table[ENTRIES + 2],
  79.     *table_ptr = table,new_entry,temp_entry;
  80.     int  numread,index = 1, numsaved, lock, already = 0, output_value = 1,
  81.     user_id, position;
  82.     FILE *fp;
  83. #ifdef NO_RESTORED_GAME_HISCORES
  84.     if (saved_game) {
  85.     printf("No hiscores recorded from restored games.\n");
  86.     printf("\nWANDERER Copyright (C) 1988 S. Shipway.\n\n");
  87.     return 1;
  88.     }
  89. #endif
  90.     user_id = getuid();
  91.     strncpy(new_entry.howdead,howdead,25);
  92.     new_entry.howdead[24] = '\0';    /* M002 strncpy does not null terminate */
  93.     strncpy(new_entry.name,name,20);
  94.     new_entry.name[19] = '\0';    /* M002 strncpy does not null terminate */
  95.     new_entry.score = score;
  96.     new_entry.level = level;
  97.     new_entry.uid = user_id;
  98.     LOCK;
  99.     numread = readtable(table_ptr);
  100.     if (numread > 0)
  101.     if(table[numread-1].score > 99999) {    /* stop system errors messing it up*/
  102.         numread--;
  103.         printf("Erasing spurious entry in table.\n");
  104.     }
  105.     if (score == -1) {
  106.     show_scores(table,numread);
  107.     UNLOCK;
  108.     return 0;
  109.     }
  110.     if (numread > 0) {
  111.     numread++;    /* scan through until correct insertion point */
  112.     /* pass table entries with higher scores */
  113.     while ((table_ptr->score > score)&&(index < numread)) {
  114. #ifdef    COMPARE_BY_NAME
  115. #define    SAMEUSER(p)    (strcmp((p)->name, name) == 0)
  116. #else
  117. #define    SAMEUSER(p)    ((p)->uid == user_id)
  118. #endif
  119.         if (SAMEUSER(table_ptr)) {
  120.         already = 1;
  121.         break;
  122.         }
  123.         table_ptr++;
  124.         index++;
  125.     }
  126.     /* pass table entries with equal score but higher or equal level */
  127.     while ((table_ptr->level>=level) && (index<numread) &&
  128.         (table_ptr->score==score)) {
  129.         if (SAMEUSER(table_ptr)) {
  130.         already = 1;
  131.         break;
  132.         }
  133.         table_ptr++;
  134.         index++;
  135.     }
  136.     position = index;
  137.     /* if already found: done */
  138.     if (already == 1) {
  139.         numread--;
  140.         UNLOCK;
  141.         return numread;
  142.     }
  143.     /* shift down score list */
  144.     while (index < numread) {
  145.         /* swap *table_ptr and new_entry */
  146.         temp_entry = *table_ptr;
  147.         *table_ptr = new_entry;
  148.         new_entry = temp_entry;
  149.         if (SAMEUSER(&new_entry)) {
  150.         already = 1;
  151.         numread--;    /* an older entry found */
  152.         break;
  153.         }
  154.         table_ptr++;
  155.         index++;
  156.     }
  157.     /* if all shifted without finding an older entry */
  158.     if (already == 0)
  159.         *table_ptr = new_entry;
  160.         wmove(messagewin,0,0);
  161.     if (position <= ENTRIES)
  162.             {
  163.             waddstr(messagewin,"You rank ");
  164.             sprintf(string,"%d",position);
  165.             waddstr(messagewin,string);
  166.             waddstr(messagewin," in the high score table");
  167.         /* printf("You rank %d in the hiscore table.\n",position);*/
  168.             }
  169.     else
  170.         waddstr(messagewin,"You didn't make it into the hiscore table."); 
  171.         wrefresh(messagewin);
  172.     } else {
  173.     printf("\nCreating new hiscore table.\n\n");
  174.     *table_ptr = new_entry;
  175.     numread++;
  176.     }
  177.     numread = ((numread > ENTRIES) ? ENTRIES : numread);
  178.     fp = fopen(HISCOREPATH,W_BIN);
  179.     table_ptr = table;
  180.     numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  181.     chmod(HISCOREPATH,0666);
  182.     if (numsaved < numread) {
  183.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  184.     output_value = 0;
  185.     }
  186.     fclose(fp);
  187.     UNLOCK;
  188.     return output_value;
  189. }
  190.  
  191. void delete_entry(num)
  192. int num;
  193. {
  194.     score_entry table[ENTRIES + 22],
  195.     *table_ptr = table,
  196.     new_entry,temp_entry;
  197.     int  numread,index = 1, numsaved, lock, output_value = 1;
  198.     FILE *fp;
  199.     LOCK;
  200.     numread = readtable(table_ptr);
  201.     if (numread == 0) {
  202.     printf("Missing or unreadable hiscore table.\n\n");
  203.     UNLOCK;
  204.     exit(1);
  205.     }
  206.     if (num > numread) {
  207.     printf("Invalid entry, choose again\n");
  208.     UNLOCK;
  209.     return;
  210.     }
  211.     while (index < num) {
  212.     index++;
  213.     table_ptr++;
  214.     }
  215.     while (index < numread) {
  216.     index++;
  217.     *table_ptr = *(table_ptr+1);
  218.     table_ptr++;
  219.     }
  220.     numread--;
  221.     fp = fopen(HISCOREPATH,W_BIN);
  222.     table_ptr = table;
  223.     numsaved = fwrite(VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  224.     chmod(HISCOREPATH,0666);
  225.     if (numsaved < numread) {
  226.     printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
  227.     output_value = 0;
  228.     }
  229.     fclose(fp);
  230.     UNLOCK;
  231.     show_scores(table,numsaved);
  232. }
  233.  
  234. erase_scores()
  235. {
  236.     int erasenum, numread, index = 0;
  237.     char correct[20], c;
  238.     score_entry table[ENTRIES + 2],
  239.     *table_ptr = table;
  240.  
  241. /*  *******  I don't know why this code doesn't work
  242.     *******  SS 1-Jan-97
  243.     printf("Please enter password:");
  244.     while (((c = wgetch(stdscr)) != '\n') && index <19)
  245.     correct[index++] = c;
  246.     correct[index] = 0;
  247.     scanf("%s",correct);
  248.     if (strcmp(correct,MASTERPASSWORD)) {
  249.     printf("\nFoo, charlatan!\n");
  250.     return 0;
  251.     }
  252.  *************   */
  253.     numread = readtable(table_ptr);
  254.     show_scores(table,numread);
  255.     printf("\n");
  256.     for(;;) {
  257.     printf("Number to erase (0 to exit): ");
  258.     scanf("%d",&erasenum);
  259.     printf("\n");
  260.     if (erasenum == 0)
  261.         break;
  262.     delete_entry(erasenum);
  263.     printf("\n");
  264.     }
  265.     printf("Byee!\n");
  266. }
  267.